import { AxiosError, type AxiosInterceptorOptions, type AxiosRequestConfig, type AxiosResponse } from 'axios'

/**
 * HTTP 请求拦截器
 */
export interface HttpRequestInterceptor {

    /**
     * 拦截错误请求
     */
    onRejected?: (error: any) => any

    /**
     * 配置选项 & 匹配器
     */
    options?: AxiosInterceptorOptions

    /**
     * 拦截请求
     */
    onFulfilled(request: AxiosRequestConfig): AxiosRequestConfig | Promise<AxiosRequestConfig>

}


/**
 * HTTP 响应拦截器
 */
export interface HttpResponseInterceptor {

    /**
     * 拦截错误响应
     *
     * 返回值表示对错误的处理结果:
     * Promise `resolve` 表示这个错误被处理了, 可以认为请求已成功;
     * `reject` 表示无法处理或已转换错误类型, 请求依然应该视为失败
     */
    onRejected?: (error: AxiosError | any) => Promise<any>

    /**
     * 拦截响应
     *
     * 禁止修改响应结构! 响应结构修改应该使用请求包装器, 否则会影响其他拦截器执行
     *
     * @param response 响应
     * @return 同入参
     */
    onFulfilled(response: AxiosResponse): AxiosResponse | Promise<AxiosResponse>

}

export interface HttpInterceptorManagerSpec {
    /**
     * 添加请求拦截器
     * @param interceptor 拦截器
     * @param name 可选: 拦截器名称, 唯一
     */
    addRequestInterceptor(interceptor: HttpRequestInterceptor, name: string): void

    /**
     * 移除请求拦截器
     * @param name 注册时名称 不能为空
     */
    removeRequestInterceptor(name: string): void

    /**
     * 添加响应拦截器
     * @param interceptor 拦截器
     * @param name 可选: 拦截器名称, 唯一
     */
    addResponseInterceptor(interceptor: HttpResponseInterceptor, name: string): void

    /**
     * 移除响应拦截器
     * @param name 注册时名称 不能为空
     */
    removeResponseInterceptor(name: string): void
}
